#ifndef KEY_H_
#define KEY_H_

#include "Defines.h"
#include <ctime>

/*-----------------------------------------------------------------------------
 *  Tamanho da chave
 *-----------------------------------------------------------------------------*/
#define KEY_SIZE    26

/*
 * =====================================================================================
 *        Class:  InvalidKeyException
 *  Description:  Exceção para messagem muito grande
 * =====================================================================================
 */
class InvalidKeyException: public exception
{

public:

    InvalidKeyException(const string &key) throw()
    {
        msg = "Error: Could not load key from file '" + key + "'";
    }

    virtual ~InvalidKeyException() throw() { }

    virtual const char* what() const throw () { return msg.c_str(); }

    string msg;
};

/*
 * =====================================================================================
 *        Class:  Key
 *  Description:  Classe que representa a chave de transposição utilizada
 * =====================================================================================
 */
class Key
{

public:

    /*-----------------------------------------------------------------------------
     *  Qualidade da estaganografia (quantidade de bits utilizados para esconder
     *  a mensagem)
     *-----------------------------------------------------------------------------*/
    enum { LOW_QUALITY, MEDIUM_QUALITY, HIGH_QUALITY };

    /*-----------------------------------------------------------------------------
     *  Contrói uma chave aleatória, mas passando a qualidade
     *-----------------------------------------------------------------------------*/
    Key(int qualidade);

    /*-----------------------------------------------------------------------------
     *  Contrói uma chave a partir de um arquivo
     *-----------------------------------------------------------------------------*/
    Key(const string &key);

    /*-----------------------------------------------------------------------------
     *  Escreve a chave em um arquivo
     *-----------------------------------------------------------------------------*/
    void write(const string &key);

    /*-----------------------------------------------------------------------------
     *  Nova posição
     *-----------------------------------------------------------------------------*/
    uint position[KEY_SIZE];

    /*-----------------------------------------------------------------------------
     *  Quantidade de bits utilizados para esconder a mensagem
     *-----------------------------------------------------------------------------*/
    uint nbits;

};

#endif /* KEY_H_ */
